from rest_framework.viewsets import ReadOnlyModelViewSet
from rest_framework_extensions.cache.mixins import CacheResponseMixin

from .models import Area
from .serializer import AreasSerializer, SubsAreasSerializer

"""
因为ReadOnlyModelViewSet=ListModelMixin+RetreveModelMixin+GenericAPIView,
而CacheResponseMixin需要与ListModelMixin和RetreveModelMixin配合使用,
所以可以直接继承CacheResponseMixin.
"""
"""
每次请求视图集的时候,都会CacheResponseMixin去查询这个视图集里存的数据到底在不在,
如果在,就不进视图集里执行查询了;
如果不在,才进视图集里执行查询,查完以后CacheResponseMixin再自动将它存储到redis.
之所以做缓存,是因为省市区三级联动的数据是好多年都不变的,所以可以缓存下来.
"""
# 多继承规则:先把扩展的父类的业务逻辑处理完,再处理最后的.
class AreasViewSet(CacheResponseMixin, ReadOnlyModelViewSet):
    """提供省市区三级联动数据"""

    # 指定要输出的数据来自哪个查询集
    # queryset = Area.object.all()

    def get_queryset(self):
        """根据请求的行为,过滤不同的行为对应的序列化器需要的数据"""
        if self.action == "list":
            return Area.objects.filter(parent=None)  # parent=None 是省级数据
        else:
            return Area.objects.all()
        # 请求行为是list的时候,找出父级为none的数据就是省级,这个数据是省级列表吧
        #  那请求行为是retreve的时候,找到的是单个省级吧,他就不用过滤parent为none的情况?
    """
    不需要定义list和retreve方法,
    因为ReadOnlyModelViewSet已经定义好了,
    只需要指定查询集就行.
    因为ReadOnlyModelViewSet集成了GenerciAPIView,
    GenerciAPIView需要靠序列化器来响应数据.
    """
    # 指定序列化器
    def get_serializer_class(self):
        if self.action == "list":
            return AreasSerializer
        else:
            return SubsAreasSerializer